﻿using System.Collections.Generic;
using ModelingProjectLib.Interfaces;
using System.Diagnostics;
using System.Windows;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace INSAwarsWPF
{
    public class GameViewModel : ViewModelBase
    {
        public GameView View { get; set; }

        public Partie PartieCourante { get; set; }
        public ObservableCollection<CaseViewModel> Cases { get; private set; }
        public EnsembleJoueursViewModel Joueurs { get; private set; }

        public GameViewModel(GameView gw, Partie partie)
        {
            View = gw;
            PartieCourante = partie;

            // important pour que les objets se mettent à jour tout seul
            Cases = new ObservableCollection<CaseViewModel>();
            Joueurs = new EnsembleJoueursViewModel(this);

            for (int i = 0; i < PartieCourante.CartePartie.Taille; i++)
            {
                for (int j = 0; j < PartieCourante.CartePartie.Taille; j++)
                {
                    CaseViewModel cvm = new CaseViewModel(this, i, j, PartieCourante.CartePartie.MatriceCases[i][j]);
                    Cases.Add(cvm);
                }
            }

            foreach (Joueur j in PartieCourante.ListJoueurs)
            {
                JoueurViewModel jvm = new JoueurViewModel();
                foreach (Unite unit in j.Civilisation.ListUnites)
                {
                    int ind = unit.ColumnPosition + PartieCourante.CartePartie.Taille * unit.RowPosition;

                    UniteViewModel unitVM = new UniteViewModel(Cases[ind], unit);
                    Cases[ind].Unites.Add(unitVM);

                    jvm.DerniereCaseSelectionnee = Cases[ind];
                    jvm.DerniereUniteSelectionnee = unitVM;

                    if (j == PartieCourante.JoueurCourant && unit is Enseignant) {
                        // on commence la partie avec l'enseignant du premier joueur sélectionné
                        SelectedCase = Cases[ind];
                        SelectedCase.SelectedUnite = unitVM;
                    }
                }
                Joueurs.Add(jvm);

                foreach (Ville ville in j.Civilisation.ListVilles)
                {
                    int ind = ville.ColumnPosition + PartieCourante.CartePartie.Taille * ville.RowPosition;

                    VilleViewModel villeVM = new VilleViewModel(Cases[ind], ville);
                    Cases[ind].VilleCase = villeVM;
                }
            }

            Joueurs.DoApresRemplissage();
        }
        /*
        public void joueurSuivant()
        {
            Joueurs.joueurSuivant();
			//Joueurs[0].DerniereUniteSelectionnee = SelectedCase.SelectedUnite
			// Remettre le mouvement au max
           Joueur j_courant = PartieCourante.JoueurCourant;
           int taille = j_courant.Civilisation.ListUnites.Count;

           for (int i = 0; i < taille; i++)
           {
               j_courant.Civilisation.ListUnites[i].Mvt = 2;// j_courant.Civilisation.ListUnites[i].MvtMax;
           }
            PartieCourante.joueurSuivant();
            RaisePropertyChanged("PresentationJoueurCourant");
           
            // TODO : il faut, au changement de joueur, que les informations se synchronisent à l'écran,
            // que la dernière unité sélectionnée de l'ancien joueur redevienne sélectionnée, 
            // que la vue se décale vers cette unité, etc...
        }*/

        


        private CaseViewModel selectedCase;
        public CaseViewModel SelectedCase
        {
            get { return selectedCase; }

            set
            {
                if (selectedCase != value)
                {
                    if (selectedCase != null)
                    {
                        selectedCase.SelectedUnite = null; // on déselectionne l'unité dans la case
                        selectedCase.IsSelected = false;
                    }

                    selectedCase = value;

                    if (selectedCase != null)
                    {
                        selectedCase.IsSelected = true;
                        if (View.ListBoxJeu != null) View.ListBoxJeu.ScrollIntoView(selectedCase); //marche pas au démarrage
                    }

                    RaisePropertyChanged("SelectedCase");
                }
            }
        }
 
        public void majViewChangementJoueur()
        {
            RaisePropertyChanged("SelectedCase");
        }
    }


}
